{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1 CairoSVG介绍 \n",
    "CairoSVG是一个将SVG1.1转为PNG，PDF, PS格式的转化。SVG算目前火热的图像文件格式了，它的英文全称为Scalable Vector Graphics，意思为可缩放的矢量图形，但是SVG要专用软件才能编辑打开,通过CairSVG我们就能将SVG格式转换为常用的格式。它为类Unix操作系统（至少Linux和macOS）和Windows提供了命令行界面和Python 3.5+库。它是一个开源软件，具有LGPLv3许可。  \n",
    "CairoSVG用Python编写，基于著名的2D图形库Cairo。它在来自W3C测试套件的 SVG样本上进行了测试。它还依赖tinycss2和 cssselect2来应用CSS，并依赖 defusedxml来检测不安全的SVG文件。嵌入式栅格图像由Pillow处理。 \n",
    "CarioSVG仅支持python3，你可以用pip命令安装，安装代码如下：\n",
    "> pip3 install cairosvg\n",
    "\n",
    "本文主要使用2.4.2版本，当前版本的CairoSVG至少需要Python 3.5，但不适用于Python2.x。较旧的CairoSVG（1.x）版本可在Python 2.x中使用，但不再受支持。CairoSVG及其依赖项在安装过程中可能需要其他工具，这些工具的名称取决于您使用的操作系统。具体如下：\n",
    "+ 在Windows上，您必须安装适用于Python和Cairo的Visual C ++编译器\n",
    "+ 在macOS上，您必须安装cairo和libffi \n",
    "+ 在Linux上，你必须安装cairo，python3-dev和libffi-dev（名称可能为你的系统版本有所不同)\n",
    "如果您不知道如何安装这些工具，则可以按照[WeasyPrint安装指南](https://weasyprint.readthedocs.io/en/latest/install.html)中的简单步骤进行操作：安装WeasyPrint还将安装CairoSVG。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2 CairoSVG的使用 "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.1 命令行使用 \n",
    "通过命令行你就可以使用CairoSVG，以下代码能够将当前目录下的image.svg文件转换为image.png文件：\n",
    "> cairosvg image.svg -o image.png\n",
    "\n",
    "具体CairoSVG命令行参数如下：\n",
    "```\n",
    "cairosvg --help\n",
    "usage: cairosvg [-h] [-v] [-f {pdf,png,ps,svg}] [-d DPI] [-W WIDTH]\n",
    "                [-H HEIGHT] [-s SCALE] [-u] [--output-width OUTPUT_WIDTH]\n",
    "                [--output-height OUTPUT_HEIGHT] [-o OUTPUT]\n",
    "                input\n",
    "\n",
    "Convert SVG files to other formats\n",
    "\n",
    "positional arguments:\n",
    "  input                 input filename or URL 文件名或者url链接名\n",
    "\n",
    "optional arguments:\n",
    "  -h, --help            show this help message and exit 帮助\n",
    "  -v, --version         show program's version number and exit 版本查看\n",
    "  -f {pdf,png,ps,svg}   --format {pdf,png,ps,svg} output format 输出格式                      \n",
    "  -d DPI, --dpi DPI     ratio between 1 inch and 1 pixel 输出图像dpi比率设置 DPI比率介于1英寸和1像素之间\n",
    "  -W WIDTH, --width WIDTH    width of the parent container in pixels 输入图像宽\n",
    "  -H HEIGHT, --height HEIGHT  height of the parent container in pixels 输入图像高\n",
    "  -s SCALE, --scale SCALE    output scaling factor 输出图像缩放比例\n",
    "  -u, --unsafe          resolve XML entities and allow very large files 解析XML实体\n",
    "                        (WARNING: vulnerable to XXE attacks and various DoS) 但是有安全问题\n",
    "  --output-width OUTPUT_WIDTH     desired output width in pixels 期望图像输出宽\n",
    "  --output-height OUTPUT_HEIGHT   desired output height in pixels 期望图像输出高\n",
    "  -o OUTPUT, --output OUTPUT     output filename 图像输出名\n",
    "```\n",
    "支持的输出格式是pdf，ps，png和svg（默认为 pdf）。默认output为标准输出。如果提供了输出文件名，则会根据扩展名自动选择格式。这些dpi选项设置像素与实际单位（例如，毫米和英寸）之间的比率（如[规范](https://www.w3.org/TR/SVG11/coords.html)中所述）。可以为SVG文件提供宽度和高度选项来设置容器大小。此外，如果-用作文件名，CairoSVG将从标准输入中读取SVG字符串。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.2 python库使用\n",
    "CairoSVG为Python 3.5+提供了一个模块。该cairosvg模块提供4个功能：\n",
    "+ svg转pdf\n",
    "+ svg转png\n",
    "+ svg转ps\n",
    "+ svg2转svg(svg文件切割)\n",
    "\n",
    "这些函数需要以下命名参数之一：\n",
    "+ url，URL或文件名\n",
    "+ file_obj，类似文件的对象\n",
    "+ bytestring，一个包含SVG的字节字符串\n",
    "\n",
    "他们还可以接收与命令行选项相对应的这些可选参数：\n",
    "+ parent_width\n",
    "+ parent_height\n",
    "+ dpi\n",
    "+ scale\n",
    "+ unsafe\n",
    "\n",
    "如果write_to提供了参数（文件名或类似文件的对象），则将输出写入此处。否则，该函数将返回一个字节字符串。例如：\n",
    "> cairosvg.svg2png(url=\"/path/to/input.svg\", write_to=\"/tmp/output.png\")  \n",
    "cairosvg.svg2pdf(file_obj=open(\"/path/to/input.svg\", \"rb\"), write_to=\"/tmp/output.pdf\")  \n",
    "output = cairosvg.svg2ps(bytestring=open(\"/path/to/input.svg\").read().encode('utf-8'))\n",
    "\n",
    "使用实例：\n",
    "``` python\n",
    "# -*- coding: utf-8 -*-\n",
    "\n",
    "# 导入cairosvg库\n",
    "import cairosvg\n",
    "\n",
    "# svg转pdf\n",
    "# file_obj输入文件名 write_to输出文件名\n",
    "cairosvg.svg2pdf(file_obj=open(\"image.svg\", \"rb\"), write_to=\"output.pdf\")  \n",
    "\n",
    "# svg转png\n",
    "# file_obj输入文件名 write_to输出文件名 scale输出图像放大倍数\n",
    "cairosvg.svg2png(file_obj=open(\"image.svg\", \"rb\"), write_to=\"d:/output.png\",scale=3.0)\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3 参考\n",
    "+ [CairoSVG官网](https://cairosvg.org/)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
